home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Power Programmierung
/
Power-Programmierung CD 2 (Tewi)(1994).iso
/
doc
/
lw
/
loop
/
loop.asm
Wrap
Assembly Source File
|
1987-08-15
|
3KB
|
49 lines
Date: Friday, 14 August 1987 04:43-MDT
From: Ya'akov_Miles%UBC.MAILNET at MIT-Multics.ARPA
To: Info-IBMPC at C.ISI.EDU
Re: Re INFO-IBMPC Digest 30 Efficient Block Transfers
Title Loop
;Demonstrate Block Transfer technique, sometimes called Transfer Vectoring
COUNT =12345 ; Number of bytes to read
BLOCK_SIZE =9 ; Bytes per data transfer block
PORT =241h ; Clock. BCD seconds/100. (341h ?)
;
BLOCK_SIZE =BLOCK_SIZE and 0FFFEh ; Force even # of bytes/xfer block
;
Code Segment ; Declare Segment before "Assume"
Assume ds:Code,ss:Code,cs:Code,es:Code ; Segment order avoids "problems"...
ORG 0100h ; Start address for .COM binary file
begin: mov di,offset DATA ; ES:[DI] --> data area
mov cx,COUNT ; Get total bytes to transfer
mov bx,BLOCK_SIZE ; Get data transfer block size, BYTES
mov ax,cx ; Get lo order transfer byte count
xor dx,dx ; ...zero hi order byte count
div bx ; AX = blocks, DX = remainder
push ax ; ...save block count
mov cx,dx ; Get bytes in partial block
mov dx,PORT ; ...load clock port
jcxz exact ; Exact number of blocks in transfer
;
fract: in al,dx ; Read BCD seconds/hundred.
stosb ; ...ES:[DI] --> (next) saved result
loop fract ; ...until done
;
exact: pop cx ; Load number of blocks to transfer
jcxz done ; ...less than one block in xfer
;
block: Rept BLOCK_SIZE/2 ; Unroll DO loop this amount, bytes
in al,dx ; Read BCD seconds/hundred
xchg ah,al ; ...save temporary in register
in al,dx ; Read BCD seconds/hundred
xchg ah,al ; ...swap bytes to IBM order. Yuk
stosw ; ...ES:[DI] --> (next) saved result
Endm ; ...end of unrolled DO loop
loop block ; ...love FORTRAN
;
done: ret ; Back to BASIC programming
data: ; ...data area after program
Code ends
;
End Begin